package top.riske.animalhazardassessment.common.http.request;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import top.riske.animalhazardassessment.common.DTO.JwtDto;
import top.riske.animalhazardassessment.common.filter.AuthorizationFilter;


/**
 * 用于从请求头中解析JwtDto参数
 * 在controller方法中，可以直接使用JwtDto jwtDto来获取用户信息，而不需要添加注解@RequestAttribute("JwtDto")
 */
@Component
public class JwtDtoArgumentResolver implements HandlerMethodArgumentResolver {

    /**
     * 判断是否支持解析JwtDto参数
     * @param parameter 表示Controller方法的参数信息
     * @return 如果参数类型是JwtDto，则支持解析
     */
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return JwtDto.class.isAssignableFrom(parameter.getParameterType());
    }

    /**
     * 解析参数并返回对应的JwtDto对象
     * @param parameter 表示Controller方法的参数信息。
     * @param mavContainer 用于存储模型和视图信息。
     * @param webRequest 表示当前的Web请求。
     * @param binderFactory 用于创建WebDataBinder。
     * @return Object 返回从请求属性中获取的JwtDto对象。
     * @throws Exception 如果解析过程中发生错误，则抛出异常。
     */
    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
        // 从请求属性中获取JwtDto对象并返回
        return request.getAttribute(AuthorizationFilter.AUTHORIZATION_DATA_HEADER);
    }
}
